import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

public class Client {
    private static final long REPORT_INTERVAL = 3 * 60 * 1000; // 报告间隔时间，单位：毫秒

    public static void main(String[] args) {
        try {
            Scanner scanner = new Scanner(System.in);

            // 连接许可证服务器
            Socket socket = new Socket("localhost", 8889);

            // 接收服务器返回的询问是否有序列号
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String response = in.readLine();
            System.out.println(response);

            // 用户输入是否有序列号
            String hasSerialNumber = scanner.nextLine().toLowerCase();

            if (hasSerialNumber.equals("y")) {
                // 用户已有序列号，输入序列号进行验证
                System.out.println("请输入序列号:");
                String inputSerialNumber = scanner.nextLine();

                // 发送序列号给服务器进行验证
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                out.println(hasSerialNumber);
                out.println(inputSerialNumber);
            } else {
                // 用户没有序列号，输入用户名、口令和许可证类型
                System.out.println("请输入用户名:");
                String username = scanner.nextLine();
                System.out.println("请输入口令:");
                String password = scanner.nextLine();
                System.out.println("请输入许可证类型:");
                String licenseType = scanner.nextLine();

                // 发送用户名、口令和许可证类型给服务器以获取序列号
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                out.println(hasSerialNumber);
                out.println(username + ":" + password + ":" + licenseType);

                // 接收服务器返回的序列号
                String serialNumber = in.readLine();
                System.out.println(">>>>> 序列号为: " + serialNumber);

                // 用户输入序列号进行验证
                System.out.println("请输入序列号:");
                String inputSerialNumber = scanner.nextLine();

                // 发送序列号给服务器进行验证
                out.println(inputSerialNumber);
            }

            // 接收服务器返回的授权或拒绝指令
            response = in.readLine();

            // 处理服务器返回的指令
            if (response.equals("AUTHORIZED")) {
                System.out.println("授权成功");
                System.out.println(">>>>>你当前正在使用软件......");

                // 启动定时报告任务
                TimerTask reportTask = new TimerTask() {
                    @Override
                    public void run() {
                        // 向服务器报告状态
                        try {
                            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                            out.println("REPORT");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                };

                Timer timer = new Timer();
                timer.schedule(reportTask, REPORT_INTERVAL, REPORT_INTERVAL);
            } else {
                System.out.println("授权失败，请稍后再试");
            }

            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
